﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using SisCRA.Classes;
using SisCRA.Database;

namespace SisCRA.Business
{
    public class ActivityBLL
    {
        #region -Public Methods-

        /// <summary>
        /// Método que chama a camada de dados para salvar uma atividade. 
        /// Caso a atividade já exista chama o método de Update, senão chama o método de Insert.
        /// </summary>
        /// <param name="activity">Objeto Atividade</param>
        public void SaveActivity(Activity activity)
        {
            try
            {
                ActivityDAL activityDAL = new ActivityDAL();

                if (activity.Id > 0)
                {
                    activityDAL.UpdateActivity(activity.Id, activity.Name.ToUpper(), activity.Description.ToUpper(), activity.Percentage, activity.DisciplineId);
                }
                else
                {
                    activityDAL.InsertActivity(activity.Name.ToUpper(), activity.Description.ToUpper(), activity.Percentage, activity.DisciplineId);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que verifica se a soma dos pesos das atividades não ultrapassa 100%.
        /// </summary>
        /// <param name="activity">Objeto Atividade</param>
        /// <returns>True se a soma dos pesos das atividades for menor ou igual a 100%, caso contrário False</returns>
        public bool IsPercentageOk(Activity activity)
        {
            double sum = 0;

            try
            {
                ActivityDAL activityDAL = new ActivityDAL();
                DataTable dt = activityDAL.GetAllByDiscipline(activity.DisciplineId);

                // Somando o peso da atividade informada pelo usuário.
                sum += activity.Percentage;

                // Somando os pesos das atividades já cadastradas. 
                foreach (DataRow dr in dt.Rows)
                {
                    if (activity.Id != int.Parse(dr["ID"].ToString()))
                    {
                        sum += double.Parse(dr["PESO"].ToString());
                    }
                }

                // Se a soma total dos pesos das atividades for menor ou igual a 100%, a atividade está Ok.
                if (sum <= 100)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que verifica se a soma dos pesos das atividades é igual a 100%.
        /// </summary>
        /// <param name="activity">Objeto Atividade</param>
        /// <returns>True se a soma dos pesos das atividades for igual a 100%, caso contrário False</returns>
        public bool IsPercentage100(Activity activity)
        {
            double sum = 0;

            try
            {
                ActivityDAL activityDAL = new ActivityDAL();
                DataTable dt = activityDAL.GetAllByDiscipline(activity.DisciplineId);

                // Somando os pesos das atividades cadastradas. 
                foreach (DataRow dr in dt.Rows)
                {
                    sum += double.Parse(dr["PESO"].ToString());
                }

                // Se a soma total dos pesos das atividades for igual a 100%, o fechamento de notas será liberado.
                if (sum == 100)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que chama a camada de dados para buscar atividade(s) pelos parêmetros passados.
        /// </summary>
        /// <param name="activity">Objeto Atividade</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetActivityByParam(Activity activity)
        {
            try
            {
                ActivityDAL activityDAL = new ActivityDAL();

                if (activity.Id > 0)
                {
                    return activityDAL.GetActivityById(activity.Id);
                }
                else if (!string.IsNullOrWhiteSpace(activity.Name))
                {
                    return activityDAL.GetActivityByName(activity.Name, activity.DisciplineId);
                }
                else
                {
                    return activityDAL.GetAllByDiscipline(activity.DisciplineId);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método que chama a camada de dados para buscar todas as atividades dessa disciplina.
        /// </summary>
        /// <param name="activity">Objeto Atividade</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetAllActivityByDiscipline(Activity activity)
        {
            try
            {
                ActivityDAL activityDAL = new ActivityDAL();
                return activityDAL.GetAllByDiscipline(activity.DisciplineId);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }
}
